﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Xml;
using Entidades;
using AccesoDatos.DAO;
using AccesoDatos.IDAO;
using log4net;

namespace CapaDeGestion
{
    public class GestionApuesta
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoApuesta));
        private DaoApuesta daoApu = new DaoApuesta();


        public int ValidarToken(Token token)
        {
            TimeSpan tiempoTranscurrido;

            tiempoTranscurrido = DateTime.Now.Subtract(token.FechaInicio);
            int minutos = (tiempoTranscurrido.Minutes);
            return minutos;
        }

        public void Insertar(Apuesta apuesta)
        {

            try
            {
                daoApu.Insertar(apuesta);
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Insercion de apuesta realizada con exito");


            }
            catch (Exception exception)
            {
                log.Error("Error en insercion de apuesta. Mensaje: " + exception.Message);
                throw new Exception();
            }
        }
     

        public bool InsertarApuestaServicio(int idApuesta,int idMaq, int idHistorial, int idFactura/*,DateTime fechaApuesta*/, int posicion, int monto)
        {
            try
            {
                Factura factura = new Factura();
                GestionFactura gestionFactura = new GestionFactura();
                if (gestionFactura.ExisteFactura(idFactura))
                {
                    factura = gestionFactura.SeleccionarPorId(idFactura);
                }
                else
                {
                    factura.Numero = idFactura;
                    factura.Fecha = DateTime.Now;
                    gestionFactura.Insertar(factura);
                }
                GestionHistorialEvento gestionHistorialEvento=new GestionHistorialEvento();
                HistorialEvento historial=gestionHistorialEvento.SeleccionarPorId(idHistorial);
               
                GestionMaquina gestionMaquina=new GestionMaquina();
                MaquinaApuesta maq = gestionMaquina.SeleccionarPorId(idMaq);
                GestionApuesta gestionApuesta = new GestionApuesta();
                Apuesta apuesta = new Apuesta();
                apuesta.Fecha = DateTime.Now;
                apuesta.Maquina = maq;
                apuesta.Monto = monto;
                apuesta.Historial = historial;
                apuesta.Posicionpuntos = posicion;
                apuesta.Factura = factura;
                apuesta.Idapuesta = idApuesta;
                gestionApuesta.Insertar(apuesta);
                return true;
            }
            catch (Exception exception)
            {
                throw new Exception();
            }
        }

        public  string Token()
        {
            try{
                    string myRandomCharSet = "abcdefghijklmnopqrstuvwxyz";
                    StringBuilder sb = new StringBuilder();

                    // The length of this array determines the length of the string
                    byte[] randomBytes = new Byte[16];

                    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                    rng.GetBytes(randomBytes);

                    for (int i = 0; i < randomBytes.Length; i++)
                    {
                        sb.Append(myRandomCharSet[randomBytes[i] % myRandomCharSet.Length]);
                    }
                    string randomString = sb.ToString();

                    return randomString;
            }
            catch (Exception exception)
            {
                throw new Exception();
            }

        }

        public bool ExisteApuesta(int id)
        {
            try
            {
                IList<Apuesta> lista = new List<Apuesta>();
                lista = daoApu.SeleccionarTodos();
                for (int i = 0; i < lista.Count; i++)
                {
                    if (lista[i].Idapuesta == id)
                        return true;
                }
                return false;
            }
            catch (Exception)
            {

                throw new Exception();
            }

        }

        public bool InsertarToken(Token token)
        {
            daoApu.InsertarToken(token);
            return true;
        }

        public Token SeleccionarToken(string token)
        {
            
            Token tok=daoApu.SeleccionarTokenPorId(token);
            return tok;
        }


        public bool leerXml(string ruta)
        {
            //try{
                        XmlDocument xDoc = new XmlDocument();

                        //La ruta del documento XML permite rutas relativas 
                        //respecto del ejecutable!

                        xDoc.Load(ruta);
          
                        XmlNodeList carga = xDoc.GetElementsByTagName("Apuestas");

                        XmlNodeList listaApuestas =
                            ((XmlElement) carga[0]).GetElementsByTagName("Apuesta");

                        foreach (XmlElement nodo in listaApuestas)
                        {
                            int i = 0;
                            GestionFactura gestionFactura = new GestionFactura();
                            GestionApuesta gestionApuesta=new GestionApuesta();
                            
                            XmlNodeList idapuesta =
                                nodo.GetElementsByTagName("Idapuesta");
                            XmlNodeList fechaApuesta =
                                nodo.GetElementsByTagName("Fecha");
                            XmlNodeList posiciton =
                                nodo.GetElementsByTagName("Posicion_puntos");
                            XmlNodeList monto =
                                nodo.GetElementsByTagName("Monto");
                            XmlNodeList fkmaquina =
                                nodo.GetElementsByTagName("Fkmaquina");
                            XmlNodeList fkhistorial =
                                nodo.GetElementsByTagName("Fkhistorial");
                            XmlNodeList fkfactura =
                                nodo.GetElementsByTagName("Fkfactura");
                            XmlNodeList fechaFactura =
                                nodo.GetElementsByTagName("Fecha");

                            this.InsertarApuestaServicio(Convert.ToInt32(idapuesta[i].InnerText), Convert.ToInt32(fkmaquina[i].InnerText), Convert.ToInt32(fkhistorial[i].InnerText), Convert.ToInt32(fkfactura[i].InnerText), Convert.ToInt32(posiciton[i].InnerText), Convert.ToInt32(monto[i].InnerText));

                          

                            i++;
                        }
                        return true;
                    //}
                    //catch (XmlException ex)
                    //{

                    //    throw new Exception();

                    //}
                    //catch (Exception e)
                    //{
                    //     throw new Exception();
                    //}
        }

        public bool leerXmlEquipo(string ruta)
        {
            int maquinaGeneral=0;
            int facturaGeneral=0;
            int montoGeneral=0;
            //try{
            XmlDocument xDoc = new XmlDocument();

            //La ruta del documento XML permite rutas relativas 
            //respecto del ejecutable!

            xDoc.Load(ruta);

            XmlNodeList carga = xDoc.GetElementsByTagName("Apuestas");

            XmlNodeList listaApuestas =
                ((XmlElement)carga[0]).GetElementsByTagName("Apuesta");

            foreach (XmlElement nodo in listaApuestas)
            {
                int i = 0;
             

                XmlNodeList idFactura =
                    nodo.GetElementsByTagName("Id");
                XmlNodeList fkmaquina =
                    nodo.GetElementsByTagName("Fk_maquina");
                XmlNodeList fkhistorial =
                    nodo.GetElementsByTagName("Fk_persona");
                XmlNodeList monto =
                    nodo.GetElementsByTagName("Monto");
                XmlNodeList fechaFactura =
                   nodo.GetElementsByTagName("Fecha");

                maquinaGeneral = Convert.ToInt32(fkmaquina[i].InnerText);
                facturaGeneral = Convert.ToInt32(idFactura[i].InnerText);
                montoGeneral = Convert.ToInt32(monto[i].InnerText);
              //  this.InsertarApuestaServicio(Convert.ToInt32(idapuesta[i].InnerText), Convert.ToInt32(fkmaquina[i].InnerText), Convert.ToInt32(fkhistorial[i].InnerText), Convert.ToInt32(fkfactura[i].InnerText), Convert.ToInt32(posiciton[i].InnerText), Convert.ToInt32(monto[i].InnerText));
                i++;
            }

            XmlNodeList historiales = xDoc.GetElementsByTagName("HistorialApuestas");

            XmlNodeList listaHistoriales =
                ((XmlElement)historiales[0]).GetElementsByTagName("Historial");

            foreach (XmlElement nodo in listaHistoriales)
            {
                int i = 0;
               

                XmlNodeList id =
                    nodo.GetElementsByTagName("Id");
                XmlNodeList idApu =
                    nodo.GetElementsByTagName("Fk_Apuesta");
                XmlNodeList fkhistorial =
                    nodo.GetElementsByTagName("Fk_Historial_Evento_Participante");
                XmlNodeList posicion =
                    nodo.GetElementsByTagName("Puntos");

                this.InsertarApuestaServicio(Convert.ToInt32(id[i].InnerText), maquinaGeneral, Convert.ToInt32(fkhistorial[i].InnerText), facturaGeneral, Convert.ToInt32(posicion[i].InnerText), montoGeneral);
                i++;
            }
            //this.InsertarApuestaServicio(Convert.ToInt32(idapuesta[i].InnerText), Convert.ToInt32(fkmaquina[i].InnerText), Convert.ToInt32(fkhistorial[i].InnerText), Convert.ToInt32(fkfactura[i].InnerText), Convert.ToInt32(posiciton[i].InnerText), Convert.ToInt32(monto[i].InnerText));
            return true;
            //}
            //catch (XmlException ex)
            //{

            //    throw new Exception();

            //}
            //catch (Exception e)
            //{
            //     throw new Exception();
            //}
        }

       

    }

}
